const char *line_start;
guint line;
+
+ /* Use this for parsing identifiers, names and strings. */
+ GString *ident_str;
};
GtkCssParser *
parser->line_start = data;
parser->line = 0;
+ parser->ident_str = NULL;
+
return parser;
}
if (parser->file)
g_object_unref (parser->file);
+ if (parser->ident_str)
+ g_string_free (parser->ident_str, TRUE);
+
g_slice_free (GtkCssParser, parser);
}
return FALSE;
}
+static char *
+_gtk_css_parser_get_ident (GtkCssParser *parser)
+{
+ char *result;
+ gsize len;
+
+ len = parser->ident_str->len;
+
+ result = g_new (char, len + 1);
+ memcpy (result, parser->ident_str->str, len + 1);
+ g_string_set_size (parser->ident_str, 0);
+
+ return result;
+}
+
char *
_gtk_css_parser_try_name (GtkCssParser *parser,
gboolean skip_whitespace)
g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), NULL);
- name = g_string_new (NULL);
+ if (parser->ident_str == NULL)
+ parser->ident_str = g_string_new (NULL);
+
+ name = parser->ident_str;
while (_gtk_css_parser_read_char (parser, name, NMCHAR))
;
if (skip_whitespace)
_gtk_css_parser_skip_whitespace (parser);
- return g_string_free (name, FALSE);
+ return _gtk_css_parser_get_ident (parser);
}
char *
start = parser->data;
- ident = g_string_new (NULL);
+ if (parser->ident_str == NULL)
+ parser->ident_str = g_string_new (NULL);
+
+ ident = parser->ident_str;
if (*parser->data == '-')
{
if (!_gtk_css_parser_read_char (parser, ident, NMSTART))
{
parser->data = start;
- g_string_free (ident, TRUE);
+ g_string_set_size (ident, 0);
return NULL;
}
if (skip_whitespace)
_gtk_css_parser_skip_whitespace (parser);
- return g_string_free (ident, FALSE);
+ return _gtk_css_parser_get_ident (parser);
}
gboolean
}
parser->data++;
- str = g_string_new (NULL);
+
+ if (parser->ident_str == NULL)
+ parser->ident_str = g_string_new (NULL);
+
+ str = parser->ident_str;
+ g_assert (str->len == 0);
while (TRUE)
{
{
parser->data++;
_gtk_css_parser_skip_whitespace (parser);
- return g_string_free (str, FALSE);
+ return _gtk_css_parser_get_ident (parser);
}
g_string_append_c (str, *parser->data);
case '\0':
/* FIXME: position */
_gtk_css_parser_error (parser, "Missing end quote in string.");
- g_string_free (str, TRUE);
+ g_string_set_size (str, 0);
return NULL;
default:
_gtk_css_parser_error (parser,
"Invalid character in string. Must be escaped.");
- g_string_free (str, TRUE);
+ g_string_set_size (str, 0);
return NULL;
}
}